package com.wangyf.thread.c_000_whatisthread;

import java.util.concurrent.TimeUnit;

/**
 *
 * @author wangyf
 * @date 2021/1/1 12:01
 */
public class T03_Sleep_yield_Join {
    public static void main(String[] args) throws InterruptedException {
        //testSleep();
//        testYield();
        testJoin();
    }
    static void testSleep() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            System.out.println("testSleep:"+i);
            TimeUnit.MILLISECONDS.sleep(300);
        }
    }
    static void testYield() {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("A:"+i);
                if (i % 10 == 0) Thread.yield();
            }
        }).start();
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("B:"+i);
                if (i % 10 == 0) Thread.yield();
            }
        }).start();
    }
    static void testJoin() {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("t1:"+i);
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 100; i++) {
                System.out.println("t2:"+i);
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        t2.start();
        // 使用join能确保t2在t1运行结束之后运行，之前一直以为就一次
        // 使用场景
        // 但是如果主线程处理完其他的事务后，需要用到子线程的处理结果，也就是主线程需要等待子线程执行完成之后再结束，这个时候就要用到join()方法了。
        // 即join()的作用是：“等待该线程终止”，这里需要理解的就是该线程是指的主线程等待子线程的终止。
        // 也就是在子线程调用了join()方法后面的代码，只有等到子线程结束了才能执行。
        // 说明参考: https://www.open-open.com/lib/view/open1371741636171.html#_label0
        // join方法会造成当前线程wait
    }
}
